/*
 * BSharpIndexStrategy.h
 *
 *  Created on: 03/10/2009
 *      Author: nik0l4z
 */

#ifndef BSHARPINDEXSTRATEGY_H_
#define BSHARPINDEXSTRATEGY_H_
#include "IndexStrategy.h"
#include "../Externa/Clave.h"
#include "Bloque.h"
#include "Registro.h"
#include "ArchivoBinario.h"
#include "../../BSTree/BsharpTree.h"
#include "../Strategies/Resource/ResourceStrategy.h"
#include <iostream>
#include <sstream>


class BSharpIndexStrategy :public IndexStrategy{

	public:

			BsharpTree* bSharpTree;
			Node node;
			KeyNode keyNode;
			string nombreArchivo;
			int tamanioNodo;

	public: BSharpIndexStrategy(const string& nombrearch, int tamanioNodo);

	public: BSharpIndexStrategy();

	public: virtual ~BSharpIndexStrategy();

	/*---------------Metodos publicos que implementan la interfaz-------------------------------*/
	public: virtual  bool checkUniqueness(Clave *clave, Dato *dato);

	public: virtual  void updateIndex(int fileReference,Clave *clave, Dato * dato);

	/**
	 * Metodo que, apartir de una clave, me devuelve la posicion en la que se
	 * encuentra el dato correspondiente a esa clave, en el hash
	 * En caso de no encontrarla, devuelve un valor negativo.
	 */
	public: virtual int getStorageReferenceByKey(Clave *clave);

	/**
	 * Metodo que que borra la clave del indice actualizandolo.Devuelve un numero negativo en caso de error.
	 */
	public: virtual int deleteKey(Clave *clave);

	/*--------------------------------------------------------------------------------------------------*/


	public: void saludar();

	int leerBloque(unsigned int numeroBloque, Node* bloqueLeido);
	int escribirBloque(Node* bloqueNuevo);
	/*Permite modificar la informacion de un nodo*/
	int escribirBloque(unsigned short numBloque, Node* bloqueModif);

	/*Agrega una referencia en el archivo de nodos liberados al
	 * nodo que se quiere eliminar
	 */
	int eliminarBloque(unsigned short posicion);
	bool insertar(Clave* clave);
	bool eliminar(Clave* clave);
	Clave* buscar(Clave* clave);

	/**
	 *  Devuelve false si claveVieja no se encuentra insertada en el arbol. En caso contrario, la reemplaza por claveNueva
	 *	y devuelve true.
	 */
	int modificar(Clave* claveVieja, Clave* claveNueva);
	void Deserializar();
	void Serializar();
	int verificarUnicidad(Clave* clave);

	/**
	 * Workaround agregado, dado que las distintas estrategias de indexado comparten una misma interfaz, y su comportamiento no se el mismo
	 * Problema de Arquitectura.
	 */
	virtual int getClassName();

	public: virtual Almacenamiento * getStorage() const;

	public: virtual void setStorage(Almacenamiento *storage);


};

#endif /* BSHARPINDEXSTRATEGY_H_ */
